package br.com.leilao.managebean;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import br.com.leilao.dao.EditalDAO;
import br.com.leilao.dao.ProdutoDao;
import br.com.leilao.dto.ProdutoDTO;
import br.com.leilao.exception.UsuarioNaoLogadoException;
import br.com.leilao.model.Edital;
import br.com.leilao.model.Produto;
import br.com.leilao.util.FileUtil;
import br.com.leilao.util.ProdutoFilter;

@ManagedBean(name="produtoMB")
@SessionScoped
public class ProdutoMB extends ManageBeanGeneric<Produto>{
	private static final long serialVersionUID = 1L;
	private static final String LISTAR_PRODUTO = "/pages/produto/listaProduto.jsf?faces-redirect=true";
	private static final String CADASTRAR_PRODUTO = "/pages/produto/formProduto.jsf?faces-redirect=true";
	private UploadedFile file;
	private StreamedContent graphicText; 
	private boolean editouAFoto;
	private ProdutoFilter filter;
	
	
	public ProdutoMB(){
		super(Produto.class);
		this.setFilter(new ProdutoFilter());
	}
	
	@Override
	public String listar(){
		try {
			ProdutoDao dao = new ProdutoDao();
			ArrayList<Produto> produtosbase;
			produtosbase = dao.findProdutos(this.filter);
			this.setLista(produtosbase);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return LISTAR_PRODUTO;
	}

	public void handleFileUpload(FileUploadEvent event) {  
         try {
        	 this.editouAFoto = true;
        	 this.file = event.getFile(); 
		 } catch (Exception e) {
			e.printStackTrace();
		}  
	} 

	
	public StreamedContent getGraphicText() {
		try{
			if(!editouAFoto){
				byte[] meuArray = getBean().getFoto();  
				if(meuArray!=null){
					InputStream input = new ByteArrayInputStream(meuArray);
					return graphicText =  new DefaultStreamedContent(input);
				}
			}
			if(this.file == null){
				return carregarImageDefault();
			}	
			return graphicText = new DefaultStreamedContent(this.file.getInputstream());
		}catch(Exception e){
			return null;
		}
	}

	private StreamedContent carregarImageDefault() throws IOException {
		FacesContext contexto = FacesContext.getCurrentInstance();
		InputStream stream = contexto.getExternalContext().getResourceAsStream("//resources//IMGS//imagemDefault.jpg");
		
		this.graphicText = new DefaultStreamedContent(stream);
		return this.graphicText;
	}
	
	public void setGraphicText(StreamedContent graphicText) {
		this.graphicText = graphicText;
	}

	public String abrirCadastro(){
		setBean(new Produto());
		this.file = null;
		return CADASTRAR_PRODUTO;
	}
	
	@Override
	public String salvar() {
		try{
			ProdutoDao produtoDao = new ProdutoDao();
		
			if(this.file == null){
				getBean().setFoto(FileUtil.lerImagemDefault());
			}else{
				getBean().setFoto(this.file.getContents());
			}
			
			if(getBean().getCodigo() !=null && getBean().getCodigo() == 0){
				produtoDao.save(getBean());
			}else{
				produtoDao.update(getBean());
			}
			
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_WARN, "Produto","Produto cadastrado com sucesso!"));
        	return listar();
		}catch(UsuarioNaoLogadoException e){
			return "index.jsf";
		}catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	@SuppressWarnings("finally")
	@Override
	public String remover(Produto produto) {
		try{
			ProdutoDao dao  = new ProdutoDao();
			dao.delete(produto);
		}catch(Exception e){
			FacesMessage msg = new FacesMessage("Erro ao deletar"+e.getCause());  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
            e.printStackTrace();
		}finally{
			return listar();
		}
	}

	public String abrirEdicao(Produto produto){
		this.editouAFoto = false;
		setBean(produto);
		return CADASTRAR_PRODUTO;
	}
	
	
	public ProdutoFilter getFilter() {
		return filter;
	}

	public void setFilter(ProdutoFilter filter) {
		this.filter = filter;
	}
	
	
	public StreamedContent getImageFromHell(){
		String idProduto = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id_produto");
		
		
		if(idProduto == null){
			try {
				return this.graphicText = carregarImageDefault();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		for (Produto produto : getLista()) {
			if(Integer.parseInt(idProduto) == produto.getCodigo()){
				byte[] meuArray = produto.getFoto();  
				if(meuArray==null){
					return this.graphicText;
				}
				InputStream input = new ByteArrayInputStream(meuArray);
				return  new DefaultStreamedContent(input);
			}
		}
		return this.graphicText;
	}
	
	public boolean produtoAbertoParaEdital(Produto aux){
		EditalDAO dao = new EditalDAO();
		return dao.findAllByAttr(Edital.class, "produto_codigo", aux.getCodigo().toString()).isEmpty();
	}
}
